package sio.slam4;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.h2.engine.Session;
import org.hibernate.Query;

public class Application {
  private static Session s = null;
  private EntityManagerFactory entityManagerFactory;
  private EntityManager entityManager;

  public Application() {
    entityManagerFactory = Persistence
        .createEntityManagerFactory("sio.slam4.tutorial.jpa");
  }

  public void go() {
    populate();
    select();
    clear();
    entityManagerFactory.close();
  }

  private void select() {
    EntityManager entityManager;
    // retrouvons des pays stock��s dans la base de donn��es
    entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();
    List<Pays> result = entityManager.createNativeQuery("select * from Pays inner join Ville on capitale_ID = Ville.id",
        Pays.class).getResultList();
    for (Pays pays : result) {
      System.out.println("Pays (" + pays.getContinent() + ") : "
          + pays.getNom() + "capitale: ("+pays.getCapitale().getNom()+")");
    }

    entityManager.getTransaction().commit();
    entityManager.close();
  }

  private void populate() {
    // creation de quelques pays
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();
    Pays alg = new Pays("Alg��rie", "Afrique", "DZ",
        java.sql.Date.valueOf("1962-07-03"));
    entityManager.persist(alg);
    Pays s = new Pays("S��n��gal", "Afrique", "SN",
        java.sql.Date.valueOf("1960-06-20"));
    entityManager.persist(s);
    Pays v = new Pays("Vietnam", "Asie", "VN",
        java.sql.Date.valueOf("1955-08-16"));
    entityManager.persist(v);
    Pays usa = new Pays("��tats Unis", "Am��rique du Nord", "US",
        java.sql.Date.valueOf("1776-07-04"));
    entityManager.persist(usa);
    
   
    //creation de quelques villes
    Ville w = new Ville("Washington", 1500000);
    entityManager.persist(w);
    w.setPays(usa);
    Ville ny = new Ville("New York", 6000000);
    entityManager.persist(ny);    
    ny.setPays(usa);
    Ville alger = new Ville("Alger", 2086212);
    entityManager.persist(alger);
    alger.setPays(alg);
    Ville oran = new Ville("Oran", 735166);
    oran.setPays(alg);
    entityManager.persist(oran);
    Ville constantine = new Ville("Constantine", 479122);
    constantine.setPays(alg);
    entityManager.persist(constantine);
    Ville sidi = new Ville("Sidi bel Abb��s", 183931);
    sidi.setPays(alg);
    entityManager.persist(sidi);

    
    //creation des Set de villes
    Set<Ville> villesUsa = new HashSet<Ville>();
    villesUsa.add(ny);
    villesUsa.add(w);
    usa.setVilles(villesUsa);  
    
    Set<Ville> villesAlgerie = new HashSet<Ville>();
    villesAlgerie.add(alger);
    villesAlgerie.add(sidi);
    villesAlgerie.add(constantine);
    villesAlgerie.add(oran);
    alg.setVilles(villesAlgerie); 
    
    //assigner une capitale �� un pays
    usa.setCapitale(w);
    alg.setCapitale(alger);
    
    
    //fermeture entity
    entityManager.getTransaction().commit();
    entityManager.close();
  }

  private void clear() {

  }

  @Override
  protected void finalize() throws Throwable {
    entityManagerFactory.close();
    super.finalize();
  }

}